package ReflectDemo;

import java.io.FileDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

//反射获取成员变量并使用
public class ReflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //创建Class对象
        Class<?> aClass = Class.forName("ReflectDemo.Stu");
        //Field[] fields = aClass.getFields(); //返回一个 Field对象的数组，
                                               //Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段
        Field[] fields = aClass.getDeclaredFields();  //返回一个Field对象的数组，
                                                      //反映了由该Class对象表示的类或接口声明的所有字段
        for(Field field : fields)
            System.out.println(field);
        System.out.println("--------");
        //通过 Class对象 获取 成员变量 address
        Field addressField = aClass.getField("address");
        //通过Class对象 获取 无参构造方法 并 创建对象
        Constructor<?> con = aClass.getConstructor();
        Object obj = con.newInstance();

        //Field 提供有关类或接口的单个字段的信息和动态访问
        //void set (Object obj, Object value)  将指定的对象参数中由此Field对象表示的字段设置为指定的新值

        //通过Field对象 给 obj 中的成员变量 address 赋值
        addressField.set(obj,"Shanghai");  //给对象obj中的成员变量addressField 赋值为 "Shanghai"
        System.out.println(obj);

    }
}
